package com.atguigu.gmall.web.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchAttr;
import com.atguigu.gmall.model.list.SearchParam;
import com.atguigu.gmall.model.list.SearchResponseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author atguigu-mqx
 * @Description TODO
 * @Date 2023/5/19 10:52
 * @Version 1.0
 */
@Controller
public class ListController {

    @Autowired
    private ListFeignClient listFeignClient;
    //  http://sph-list.atguigu.cn/list.html?category3Id=61
    //  http://sph-list.atguigu.cn/list.html?category3Id=61&trademark=1:小米&order=
    @GetMapping("list.html")
    public String list(SearchParam searchParam, Model model){
        //  将参数对象 传递给service-list;  openFeign; 只能传递Json 数据.{"category3Id":61}
        Result<Map> result = listFeignClient.list(searchParam);
        //  页面需要存储 ： searchParam trademarkParam[品牌面包屑] urlParam[用户检索条件列表] propsParamList[平台属性面包屑] orderMap[排序规则]
        //  trademarkList[品牌集合列表] attrsList[平台属性列表] goodsList[商品集合列表]  pageNo[当前页码] totalPages[总页数]
        //  第二排的内容都是 result.getData() == SearchResponseVo; 是 SearchResponseVo 对象的属性,并且这个对象中的每个属性都有数据.
        //  字符串条件拼接
        String urlParam = this.makeUrlParam(searchParam);
        //  品牌面包屑 品牌:品牌名称
        String trademarkParam = this.trademarkParam(searchParam.getTrademark());
        //  propsParamList 平台属性面包屑 这个泛型中必须有  attrId attrValue attrName 要么设计成一个map  map.put("attrId","value");...
        //  还可以设计为一个class
        List<SearchAttr> propsParamList = this.makeParamList(searchParam.getProps());
        //  存储一个排序规则
        Map<String,Object> orderMap = this.makeOrderMap(searchParam.getOrder());
        //  存储数据：
        model.addAttribute("searchParam",searchParam);
        model.addAllAttributes(result.getData());
        model.addAttribute("urlParam",urlParam);
        model.addAttribute("trademarkParam",trademarkParam);
        model.addAttribute("propsParamList",propsParamList);
        model.addAttribute("orderMap",orderMap);

        //  返回检索列表页面
        return "list/index";
    }

    /**
     * 制作排序
     * @param order order=2:asc order=1:desc
     * @return
     */
    private Map<String, Object> makeOrderMap(String order) {
        //  创建一个map 集合
        HashMap<String, Object> hashMap = new HashMap<>();
        //  判断
        if (!StringUtils.isEmpty(order)){
            //  分割：split[0] 1or2  split[1] asc/desc
            String[] split = order.split(":");
            if (split!=null && split.length==2){
                //  赋值排序规则
                hashMap.put("type",split[0]);
                hashMap.put("sort",split[1]);
            }
        }else {
            //  赋值默认排序规则
            hashMap.put("type","1");
            hashMap.put("sort","desc");
        }
        return hashMap;
    }

    /**
     * 制作平台属性面包屑
     * @param props
     * @return
     */
    private List<SearchAttr> makeParamList(String[] props) {
        //  创建集合对象
        ArrayList<SearchAttr> searchAttrArrayList = new ArrayList<>();
        //  判断
        if (props!=null && props.length>0){
            //  循环遍历 props=24:128G:机身内存&props=23:8G:运行内存
            for (String prop : props) {
                //  平台属性面包屑 平台属性名：明天属性值名
                String[] split = prop.split(":");
                if (split!=null && split.length==3){
                    //  创建属性对象
                    SearchAttr searchAttr = new SearchAttr();
                    searchAttr.setAttrId(Long.parseLong(split[0]));
                    searchAttr.setAttrValue(split[1]);
                    searchAttr.setAttrName(split[2]);
                    searchAttrArrayList.add(searchAttr);
                }
            }
        }
        //  返回平台属性面包屑集合
        return searchAttrArrayList;
    }

    /**
     * 制作品牌面包屑
     * @param trademark trademark=1:小米
     * @return
     */
    private String trademarkParam(String trademark) {
        //  判断 jdk17 -- springboot3.x trademark.isBlank()
        if (!StringUtils.isEmpty(trademark)){
            //  进行分割
            String[] split = trademark.split(":");
            if (split!=null && split.length>0){
                return "品牌："+split[1];
            }
        }
        //  默认返回空
        return null;
    }

    /**
     * 记录用户通过哪些条件进行检索.
     * @param searchParam
     * @return
     */
    private String makeUrlParam(SearchParam searchParam) {
        //  声明一个字符串拼接对象
        StringBuffer stringBuffer = new StringBuffer();
        //  判断用户是否根据分类Id 进行检索
        //  http://sph-list.atguigu.cn/list.html?category3Id=61
        if (!StringUtils.isEmpty(searchParam.getCategory3Id())){
            //  字符串拼接
            stringBuffer.append("category3Id=").append(searchParam.getCategory3Id());
        }
        if (!StringUtils.isEmpty(searchParam.getCategory2Id())){
            //  字符串拼接
            stringBuffer.append("category2Id=").append(searchParam.getCategory2Id());
        }
        if (!StringUtils.isEmpty(searchParam.getCategory1Id())){
            //  字符串拼接
            stringBuffer.append("category1Id=").append(searchParam.getCategory1Id());
        }

        //  用户可能根据全文检索进行查询
        //  http://sph-list.atguigu.cn/list.html?keyword=手机
        if (!StringUtils.isEmpty(searchParam.getKeyword())){
            //  字符串拼接
            stringBuffer.append("keyword=").append(searchParam.getKeyword());
        }

        //  用户可能通过品牌进行过滤
        if (!StringUtils.isEmpty(searchParam.getTrademark())){
            //  http://sph-list.atguigu.cn/list.html?keyword=手机&trademark=1:小米
            if (stringBuffer.length()>0){
                stringBuffer.append("&trademark=").append(searchParam.getTrademark());
            }
        }

        //  用户通过平台属性进行过滤.
        String[] props = searchParam.getProps();
        if (props!=null && props.length>0){
            //  循环遍历
            for (String prop : props) {
                if (stringBuffer.length()>0){
                    //  http://sph-list.atguigu.cn/list.html?keyword=手机&trademark=1:小米&props=24:128G:机身内存
                    //  http://sph-list.atguigu.cn/list.html?keyword=手机&trademark=1:小米&props=24:128G:机身内存&props=23:8G:运行内存
                    stringBuffer.append("&props=").append(prop);
                }
            }
        }
        return "list.html?"+stringBuffer.toString();
    }
}




